home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Personal Computer World 2005 October
/
PCWOCT05.iso
/
Software
/
FromTheMag
/
XAMPP 1.4.14
/
xampp-win32-1.4.14-installer.exe
/
xampp
/
php
/
pear
/
Net
/
Ident.php
< prev
next >
Wrap
PHP Script
|
2004-03-24
|
11KB
|
334 lines
<?php
/* vim: set expandtab tabstop=4 shiftwidth=4: */
// +----------------------------------------------------------------------+
// | PHP Version 4 |
// +----------------------------------------------------------------------+
// | Copyright (c) 1997-2002 The PHP Group |
// +----------------------------------------------------------------------+
// | This source file is subject to version 2.0 of the PHP license, |
// | that is bundled with this package in the file LICENSE, and is |
// | available at through the world-wide-web at |
// | http://www.php.net/license/2_02.txt. |
// | If you did not receive a copy of the PHP license and are unable to |
// | obtain it through the world-wide-web, please send a note to |
// | license@php.net so we can mail you a copy immediately. |
// +----------------------------------------------------------------------+
// | Author: Ondrej Jombik <nepto@pobox.sk> |
// | Original author: Gavin Brown <gavin.brown@uk.com> |
// +----------------------------------------------------------------------+
//
// $Id: Ident.php,v 1.1 2002/10/03 20:40:42 nepto Exp $
//
// Identification Protocol implementation
//
require_once 'PEAR.php';
/**
* Net_Ident default values
* @const NET_IDENT_DEFAULT_TIMEOUT Default ident query network timeout
* @const NET_IDENT_DEFAULT_PORT Default ident protocol port
*/
define('NET_IDENT_DEFAULT_TIMEOUT', 30);
define('NET_IDENT_DEFAULT_PORT', 113);
/**
* Net_Ident object states
* @const NET_IDENT_STATUS_UNDEF Undefined Net_Ident object state
* @const NET_IDENT_STATUS_OK Net_Ident object did successful query
* @const NET_IDENT_STATUS_ERROR Net_Ident object query failed
*/
define('NET_IDENT_STATUS_UNDEF', 0);
define('NET_IDENT_STATUS_OK', 1);
define('NET_IDENT_STATUS_ERROR', 2);
/**
* Net_Ident - Identification Protocol implementation according to RFC 1413
*
* The Identification Protocol (a.k.a., "ident", a.k.a., "the Ident Protocol")
* provides a means to determine the identity of a user of a particular TCP
* connection. Given a TCP port number pair, it returns a character string
* which identifies the owner of that connection on the server's system.
*
* You can find out more about the Ident protocol at
*
* http://www.ietf.org/rfc/rfc1413.txt
*
* Usage:
* <?php
* require_once 'Net/Ident.php';
* $ident = new Net_Ident;
* $user = $ident->getUser();
* $os_type = $ident->getOsType();
* echo "user: $user, operating system: $os_type\n";
* ?>
*
* @author Ondrej Jombik <nepto@pobox.sk>
* @package Net_Ident
* @version 1.0
* @access public
*/
class Net_Ident
{
/**
* Current object state (undef, ok, error)
*
* @var enum
* @access private
*/
var $_status;
/**
* Error message string;
* if $_status is "error", $_error contains system error message;
* if $_status is "ok", $_error contains ident error message
* or it is empty
*
* @var string
* @access private
*/
var $_error;
/**
* Properties array (contains remote host, remote port, ident port, etc.)
*
* @var array
* @access private
*/
var $_props;
/**
* Data array (contains ident username, ident operating system type, and
* raw line returned from ident server)
*
* @var array
* @access private
*/
var $_data;
/**
* Net_Ident object constructor
*
* Initializes class properties. Use empty string '' for any string
* parameter and value of 0 for any int parameter to set default value.
*
* @param string $remote_addr Remote host address (IP or hostname)
* @param int $remote_port Remote port (default $REMOTE_PORT)
* @param int $local_port Local port (default $SERVER_PORT)
* @param int $ident_port Ident port (default 113)
* @param int $timeout Socket timeout (default 30 seconds)
* @return none
* @access public
*/
function Net_Ident(
$remote_addr = '',
$remote_port = 0,
$local_port = 0,
$ident_port = 0,
$timeout = 0)
{
$this->_status = NET_IDENT_STATUS_UNDEF;
$this->setRemoteAddr($remote_addr);
$this->setRemotePort($remote_port);
$this->setLocalPort($local_port);
$this->setIdentPort($ident_port);
$this->setTimeout($timeout);
}
/**
* Sets remote host address (IP or hostname)
*
* @param string $remote_addr Remote host address (IP or hostname)
* @return none
* @access public
*/
function setRemoteAddr($remote_addr)
{
strlen($remote_addr) <= 0 && $remote_addr = $_SERVER['REMOTE_ADDR'];
$this->_props['remote_addr'] = $remote_addr;
}
/**
* Sets remote port
*
* @param int $remote_port Remote port (default $REMOTE_PORT)
* @return none
* @access public
*/
function setRemotePort($remote_port)
{
$remote_port = intval($remote_port);
$remote_port <= 0 && $remote_port = $_SERVER['REMOTE_PORT'];
$this->_props['remote_port'] = $remote_port;
}
/**
* Sets local port
*
* @param int $local_port Local port (default $SERVER_PORT)
* @return none
* @access public
*/
function setLocalPort($local_port)
{
$local_port = intval($local_port);
$local_port <= 0 && $local_port = $_SERVER['SERVER_PORT'];
$this->_props['local_port'] = $local_port;
}
/**
* Sets ident port
*
* @param int $ident_port Ident port (default 113)
* @return none
* @access public
*/
function setIdentPort($ident_port)
{
$ident_port = intval($ident_port);
$ident_port <= 0 && $ident_port = NET_IDENT_DEFAULT_PORT;
$this->_props['ident_port'] = $ident_port;
}
/**
* Sets socket timeout
*
* @param int $timeout Socket timeout (default 30 seconds)
* @return none
* @access public
*/
function setTimeout($timeout)
{
$timeout = intval($timeout);
$timeout <= 0 && $timeout = NET_IDENT_DEFAULT_TIMEOUT;
$this->_props['timeout'] = $timeout;
}
/**
* Performs network socket ident query
*
* @return mixed PEAR_Error on connection error
* rawdata read from socket on success
* @access public
*/
function query()
{
// query forced, clean current result
if ($this->_status == NET_IDENT_STATUS_OK) {
unset($this->_data['username']);
unset($this->_data['os_type']);
$this->_status = NET_IDENT_STATUS_UNDEF;
}
while (1) {
if ($this->_status == NET_IDENT_STATUS_ERROR) {
return new PEAR_Error($this->_error);
}
if ($socket = @fsockopen(
$this->_props['remote_addr'],
$this->_props['ident_port'],
$errno, $errstr,
$this->_props['timeout'])) {
break;
}
$this->_status = NET_IDENT_STATUS_ERROR;
$this->_error = 'Error connecting to ident server ('
.$this->_props['remote_addr'].':'
.$this->_props['ident_port']."): $errstr ($errno)"; // )
}
$line = $this->_props['remote_port'].','
.$this->_props['local_port']."\r\n";
@fwrite($socket, $line);
$line = @fgets($socket, 1000); // 1000 octets according to RFC 1413
fclose($socket);
$this->_status = NET_IDENT_STATUS_OK;
$this->_data['rawdata'] = $line;
$this->_parseIdentReponse($line);
return $line;
}
/**
* Returns ident username
*
* @return mixed PEAR_Error on connection error
* false boolean on ident protocol error
* username string on success
* @access public
*/
function getUser()
{
$this->_status == NET_IDENT_STATUS_UNDEF && $this->query();
if ($this->_status == NET_IDENT_STATUS_ERROR) {
return new PEAR_Error($this->_error);
}
return $this->_data['username'];
}
/**
* Returns ident operating system type
*
* @return mixed PEAR_Error on connection error
* false boolean on ident protocol error
* operating system type string on success
* @access public
*/
function getOsType()
{
$this->_status == NET_IDENT_STATUS_UNDEF && $this->query();
if ($this->_status == NET_IDENT_STATUS_ERROR) {
return new PEAR_Error($this->_error);
}
return $this->_data['os_type'];
}
/**
* Returns ident protocol error
*
* @return mixed error string if ident protocol error had occured
* false otherwise
* @access public
*/
function identError()
{
if ($this->_status == NET_IDENT_STATUS_OK
&& isset($this->_error)) {
return $this->_error;
}
return false;
}
/**
* Parses response from indent server and sets internal data structures
* with ident username and ident operating system type
*
* @param string $string ident server response
* @return boolean true if no ident protocol error had occured
* false otherwise
* @access private
*/
function _parseIdentReponse($string)
{
list(, $response) = explode(':', $string, 2);
list($resp_type, $add_info) = explode(':', trim($response), 2);
if (trim($resp_type) == 'USERID') {
list($os_type, $username) = explode(':', trim($add_info), 2);
$this->_data['username'] = trim($username);
$this->_data['os_type'] = trim($os_type);
return true;
} elseif (trim($resp_type) == 'ERROR') {
$this->_error = trim($add_info);
} else {
$this->_error = 'Invalid ident server response';
}
$this->_data['username'] = false;
$this->_data['os_type'] = false;
return false;
}
}
?>